<?php

namespace App\Services\User\Role;

use Illuminate\Support\Facades\DB;
use App\Services\User\App\Applogic;
use App\Services\User\User\Userlogic;
use \App\Models\User\Role;
/**
 * 角色管理的逻辑层
 */
class RoleLogin
{
//    protected $name = 'role';
//    protected $config = 'db_config_user';
//
//    private $roleModel = '\app\serveruser\model\Role';
//    private $applyRoleModel = '\app\serveruser\model\ApplyRole';
//    private $userModel = '\app\serveruser\model\User';
//
//    private $appLogic = '\App\Services\User\App\Applogic';
//    private $userLogic = '\app\serveruser\logic\User';
    // 增加一条角色记录
    public function add(array $data): array
    {
        $data['status'] = '1';
        $data['menu'] = '{}';
        $data['create_time'] = NOW;
        $data['update_time'] = NOW;
        try{
            $res = Role::insert($data);
        }catch (\Exception $e) {
            // 当唯一键重复等报错时
            return server_err(null, '数据库异常:' . $e->getMessage());
        }
        return auto_return($res, '成功增加一个角色', '增加一个角色失败');
    }
    // 禁用一个角色
    public function stop(array $data): array
    {
        isset($data['id']) ? $_where[] = ['id','=',$data['id']] : null;
        isset($data['name']) ? $_where[] = ['name','=',$data['name']] : null;

        $res = Role::where($_where)->update(['status'=>'0']);
        return auto_return($res, '成功禁用一个角色', '禁用一个角色失败');
    }
    // 启用一个角色
    public function start(array $data): array
    {
        isset($data['id']) ? $_where[] = ['id','=',$data['id']] : null;
        isset($data['name']) ? $_where[] = ['name','=',$data['name']] : null;
        if(!isset($_where)){
            return verify_err(null, '至少要传一个id或name参数');
        }
        $res = Role::where($_where)->update(['status'=>'1']);
        return auto_return($res, '成功启用一个角色', '启用一个角色失败');
    }
    // 按分页获取角色列表
    public function list(array $data)
    {
        //isset($data['status']) ? $_where['status'] = $data['status'] : null;
        if($data['status'] !== ''){
            $_where[] = ['status','=',$data['status']];
        }
        if(isset($_where)){
            $list =Role::where($_where)
                ->orderBy('id', 'desc')
                ->paginate(10);
        }else{
            $list = Role::orderBy('id', 'desc')
                ->paginate(10);
        }

        return auto_success($list, '成功获取角色列表', '获取角色列表失败');
    }
    // 编辑用户角色名,权重,和附加菜单信息
    public function edit(array $data): array
    {
        $_where[] = ['id','=',$data['id']];
        $data['update_time'] = NOW;
        try{
            $res = Role::where($_where)
                ->update($data);
        }catch (\Exception $e) {
            // 当唯一键重复等报错时
            return server_err(null, '数据库异常:' . $e->getMessage());
        }
        return auto_return($res, '成功编辑角色信息', '编辑角色信息失败');
    }
    // 根据用户的角色集获取其对应的IDS
    public function getIdsByRoles(array $data): array
    {
        $roleNames = explode(',', $data['roles']);
        $ids = Role::whereIn('name', $roleNames)->pluck('id')->toArray();
        $res['ids'] = implode(',', $ids);
        return auto_return($res, '成功获取角色IDS', '获取角色IDS失败');
    }
    // 用户申请某个角色
    public function apply(array $data): array
    {
        // TODO 检查其申请的角色是否在可允许的范围内
        // 增加申请记录 在其对应的表中存入相关信息
        $data['pass_user_id'] = '0';
        $data['status'] = '0';
        $res = \App\Models\User\ApplyRole::insertGetId($data);
        return auto_return($res, '已申请成功,请等待审核', '申请失败,请稍候尝试');
    }
    // 获取当前可以申请的角色
    public function allowApply(array $data): array
    {
        $appInfoRes = (new AppLogic())->find(['id'=>$data['app_id']]);
        if(SUCCESS_STATUS !== $appInfoRes['status']){
            return verify_err(null, '应用信息错误:' . $appInfoRes['msg']);
        }
        // 查找用户已拥有的角色
        $userInfo = (new Userlogic())->info(['id'=>$data['user_id']]);
        if(SUCCESS_STATUS !== $userInfo['status']){
            return verify_err(null, '没有相关用户信息:' . $userInfo['msg']);
        }
        $userRoles = $userInfo['res']['role_ids'];
        $allowRoleIds = $appInfoRes['res']['allow_role_ids'];
        # 可以过虑去自己已有的角色
        if ($userRoles !== '') {
            $userRoles = explode(',', $userRoles);
            $allowRoleIds = explode(',', $allowRoleIds);
            $allowRoleIds = array_diff($allowRoleIds, $userRoles);
            //$allowRoleIds = implode(',', $allowRoleIds);
        }
        $listInfo = $this->_listByIds($allowRoleIds);

        return auto_return($listInfo['res'], '成功获取可以申请的角色', '获取可以申请的角色失败');
    }
    // 根据角色的ids查找其英文名,中文名,id
    private function _listByIds($allow_role_ids): array
    {
        $list = Role::whereIn('id',$allow_role_ids)->select('id','name','name_cn')->get()->toArray();

        return auto_return($list, '成功获取角色列表', '获取角色列表失败');
    }
    // 审核用户申请的角色
    public function audit(array $data): array
    {
        // 查询申请的角色
        $applyRes = \App\Models\User\ApplyRole::where('id',$data['id'])->first();
        if(!$applyRes){
            return verify_err(null, '没有找到用户的申请记录[' . $data['id'] . ']');
        }
        // 将用户的角色追加
        $gaveData = $data;
        $gaveData['role_id'] = $applyRes['role_id'];
        $gaveRes = (new Userlogic())->giveRoles($gaveData);
        if (!in_array($gaveRes['status'], [SUCCESS_STATUS, NULL_DATA_STATUS])) {
            return $gaveRes;
        }
        $saveRes = \App\Models\User\ApplyRole::where('id',$data['id'])->update(['status'=>'1', 'pass_user_id'=>$data['pass_user_id']]);
        return auto_return($saveRes, '成功审核用户申请的角色', '审核用户申请的角色失败');
    }
    // 获取不分页的所有角色列表
    public function all(): array
    {
        $list =Role::get()->toArray();
        return auto_return($list, '成功获取不分页的所有角色列表', '获取不分页的所有角色列表失败');
    }
    // 获取某一应用下的所有的角色列表
    public function allRolesByApp(array $data): array
    {
        $query = Role::leftJoin('app','app.status','=','role.status')
            ->select('role.*','app.allow_role_ids')
            ->WhereRaw ("FIND_IN_SET(`tp_role`.`id`,`tp_app`.`allow_role_ids`)")
            ->where([['role.status','=',1]]);
        if(!empty($data['id'])){
            $query->where('app.id','=',$data['id']);
        }
        if(!empty($data['name'])){
            $query->where('app.name','=',$data['name']);
        }
        if(!empty($data['app_key'])){
            $query->where('app.app_key','=',$data['app_key']);
        }
        $list = $query->get();
        return auto_return($list, '成功获取某一应用下的所有的角色列表', '获取某一应用下的所有的角色列表失败');
    }
    // 获取某个角色的详情
    public function getRoleInfo($data): array
    {
        $_where['id'] = $data['id'];
        $info = Role::where($_where)->first()->toArray();
        return auto_return($info, '成功获取该角色的详情');
    }
}
